#include "blockQueue.hpp"
#include <pthread.h>
#include <unistd.h>
#include <ctime>
void *consumer(void *args)
{
    BlockQueue<int> *bq = static_cast<BlockQueue<int> *>(args);
    while (true)
    {
        int data = 0; // 先定义一个缓冲区
        // 1、将数据从blockqueue中获取--获取到了数据
        bq->pop(&data); // 从阻塞队列里拿出来
        // 2、结合某种业务逻辑，处理数据 -- 暂时没有这个业务，后面说
        std::cout << "consumer data: " << data << std::endl;
    }
}
void *productor(void *args)
{
    BlockQueue<int> *bq = static_cast<BlockQueue<int> *>(args);
    while (true)
    {
        // 1、先通过某种渠道获取数据
        int data = rand() % 10 + 1; // 生产1——10的数字
        // 2、将数据推送到blockqueue--完成生产过程
        bq->push(data); // 将数据安全推送到阻塞队列里
        std::cout << "productor data: " << data << std::endl;
    }
}
int mian()
{
    srand((uint64_t)time(nullptr) ^ getpid());   //^getpid()使随机数字变得更随机一些
    BlockQueue<int> *bq = new BlockQueue<int>(); // 两个线程看到的同一个队列
    // 单生产-单消费-> 多生产和多消费
    pthread_t c, p;
    pthread_create(&c, nullptr, consumer, bq);
    pthread_create(&c, nullptr, productor, bq);

    pthread_join(c, nullptr);
    pthread_join(p, nullptr);
    return 0;
}